 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=8 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Always close streams
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='finally,flush,java.io,streams,java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Always close streams</div>

<div class='main-body'>
 
<br>Streams represent resources which you must always clean up explicitly,
by calling the <tt>close</tt> method.
<p>Some&nbsp;<code>java.io</code> classes (apparently just the output classes)
include a&nbsp;<code>flush</code> method. When a <tt>close</tt> method
is called on a such a class, it automatically performs a <tt>flush</tt>.
There is no need to explicitly call
<tt>flush</tt> before calling <tt>close</tt>.
<p>One stream is chained to another by passing it to the constructor of
some second stream. When this second stream is closed, then it automatically
closes the original underlying stream as well.
<p>If multiple streams are chained together, then closing the one which
was the last to be constructed, and is thus at the highest level of abstraction,
will automatically close all the underlying streams. So, one only has to
call
<tt>close</tt> on one stream in order to close (and flush, if applicable)
an entire series of related streams.
<p><b>Example</b>
<br>
<PRE>

<span class='keyword'>import</span> java.io.*;
<span class='keyword'>import</span> java.util.*;
<span class='keyword'>import</span> java.util.logging.*;

<span class='keyword'>public</span> <span class='keyword'>class</span> ExerciseSerializable {

  <span class='keyword'>public</span> <span class='keyword'>static</span> <span class='keyword'>void</span> main(String... aArguments) {
    <span class='comment'>//create a Serializable List
</span>    List&lt;String&gt; quarks = Arrays.asList(
      <span class='literal'>"up"</span>, <span class='literal'>"down"</span>, <span class='literal'>"strange"</span>, <span class='literal'>"charm"</span>, <span class='literal'>"top"</span>, <span class='literal'>"bottom"</span>
    );

    <span class='comment'>//serialize the List
</span>    <span class='comment'>//note the use of abstract base class references
</span>
    <span class='keyword'>try</span>{
      <span class='comment'>//use buffering
</span>      OutputStream file = <span class='keyword'>new</span> FileOutputStream( <span class='literal'>"quarks.ser"</span> );
      OutputStream buffer = <span class='keyword'>new</span> BufferedOutputStream( file );
      ObjectOutput output = <span class='keyword'>new</span> ObjectOutputStream( buffer );
      <span class='keyword'>try</span>{
        output.writeObject(quarks);
      }
      <span class='keyword'>finally</span>{
        output.close();
      }
    }  
    <span class='keyword'>catch</span>(IOException ex){
      fLogger.log(Level.SEVERE, <span class='literal'>"Cannot perform output."</span>, ex);
    }

    <span class='comment'>//deserialize the quarks.ser file
</span>    <span class='comment'>//note the use of abstract base class references
</span>    
    <span class='keyword'>try</span>{
      <span class='comment'>//use buffering
</span>      InputStream file = <span class='keyword'>new</span> FileInputStream( <span class='literal'>"quarks.ser"</span> );
      InputStream buffer = <span class='keyword'>new</span> BufferedInputStream( file );
      ObjectInput input = <span class='keyword'>new</span> ObjectInputStream ( buffer );
      <span class='keyword'>try</span>{
        <span class='comment'>//deserialize the List
</span>        List&lt;String&gt; recoveredQuarks = (List&lt;String&gt;)input.readObject();
        <span class='comment'>//display its data
</span>        <span class='keyword'>for</span>(String quark: recoveredQuarks){
          System.out.println(<span class='literal'>"Recovered Quark: "</span> + quark);
        }
      }
      <span class='keyword'>finally</span>{
        input.close();
      }
    }
    <span class='keyword'>catch</span>(ClassNotFoundException ex){
      fLogger.log(Level.SEVERE, <span class='literal'>"Cannot perform input. Class not found."</span>, ex);
    }
    <span class='keyword'>catch</span>(IOException ex){
      fLogger.log(Level.SEVERE, <span class='literal'>"Cannot perform input."</span>, ex);
    }
  }

  <span class='comment'>// PRIVATE //
</span>
  <span class='comment'>//Use Java's logging facilities to record exceptions.
</span>  <span class='comment'>//The behavior of the logger can be configured through a
</span>  <span class='comment'>//text file, or programmatically through the logging API.
</span>  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>final</span> Logger fLogger =
    Logger.getLogger(ExerciseSerializable.<span class='keyword'>class</span>.getPackage().getName())
  ;
} 
</PRE>
<br>
<br>
<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicActione028-2.html?Id=25'>Finally and catch</a> <br>
 
  
  <a href='TopicAction12d8-2.html?Id=42'>Reading and writing text files</a> <br>
 
  
  <a href='TopicAction693b-2.html?Id=43'>Recovering resources</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='8'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=8 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
